/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tutorial.DesignPatterns.Observer;

import tutorial.DesignPatterns.Observer.listeners.Stapan;
import tutorial.DesignPatterns.Observer.observer.Caine;

/**
 * Acest Design Pattern se foloseste de mecanismul publish/subscribe
 * Caine publica evenimente(CaineEvent) catre CaineListeners(stapani), catre toti
 * stapani, si fiecare stapan raspunde la ce evenimente doreste.
 * Intra la categoria de Behavioral Patterns
 * 
 * Acest pattern este utilizat in multe locuri, butonul in java, de exemplu,
 * acepta mai multe tipuri de listneri (ActionListener,MouseListener, MouseMotionListener etc.)
 * si clasese care doresc sa trateze evenimentele trebuie sa implementeza interfetele
 * corespunzatoare si publica ActionEvent(la ActionListener), MouseEvent(la MouseListener) s.a.m.d.
 * 
 * Patternul acesta permite un grad de decuplare foarte mare
 * @author Boogie
 */
public class ObserverMain {
    public static void main(String[] args){
        Caine caine = new Caine("Rex");
        
        Stapan stapan = new Stapan("Ion");
        //adauga stapan la caine
        caine.addStapan(stapan);
        
        /*
         * publica evenimetul HUNGRY
         * dupa cum se vede caine publica eveminente
         * stapanul nu stie cand evenimentele vor fi publicate
         * 
         */
        
        caine.isHungry();
        
        //publica eveminetul SLEEPY
        caine.isSleepy();
        /*
         * Acest pattern nu este exclusiv OOP-ului
         * De exemplu ce am facut la SO la Thread-uri
         * era pthread_create(*pthread_t thread, *pinter_la_fuctia_care_se_executa, *argumete_la_fuctie)
         * care in principiu este acelasi lucru, dar C nefiind un limbaj OO
         * nu se paseaza un Obiect care incapsuleaza functinalitatea necesara, ci
         * se paseaza un pointer la o functie care se executa.
         * In C++ si C# se folosesc pointer la functii (numiti IDelegate) deoarece limbajul
         * permite acest lucru, in java se folosesc Interfete.
         * 
         */
    }
}
